## Carregar pacotes

library(tidyverse) # pacote que inclui diversos pacotes para ciência de dados

Roteiro

1. Vá ao Repositório de Dados Eleitorais do TSE. Na página “Resultados” e no ano 2012, faça o download do arquivo “Votação nominal por município e zona” e descompacte-o.

# Link para o zip que deve ser baixado
url <-
  "http://agencia.tse.jus.br/estatistica/sead/odsele/votacao_candidato_munzona/votacao_candidato_munzona_2012.zip"

# Verifica se na pasta do projeto já existe uma pasta chamada "dados", para salvar a base lá
if (!dir.exists("dados/")) {
  dir.create("dados/")
}

# Onde queremos salvar o zip, e com qual nome?
destfile <- paste0("dados/", basename(url))

# Faz o download do arquivo zip
curl::curl_download(url, destfile)
beepr::beep(2) # faz um som para avisar quando o download terminou!

# Descompacta o arquivo zip
zip::unzip(destfile, exdir = "dados/")

2. Abre o arquivo para São Paulo (votacao_candidato_munzona_2012_SP.txt) em R com os nomes de colunas e o encoding corretos de acordo com a seção relevante de leaime.pdf.

# Abre a base de dados utilizando o "Import Dataset".

votacao_candidato_munzona_2012_SP <-
  readr::read_delim(
    "dados/votacao_candidato_munzona_2012_SP.txt",
    ";",
    escape_double = FALSE,
    col_names = FALSE,
    locale = locale(encoding = "ISO-8859-1"),
    trim_ws = TRUE
  )

# Quais são os nomes das variáveis que estão na base?

# names(votacao_candidato_munzona_2012_SP)
# É preciso corrigir o nome das variáveis!
# Copiei manualmente o nome das variáveis e criei um vetor para usar para renomear as variáveis na base.

nome_var <- c(
  "DATA_GERACAO",
  "HORA_GERACAO",
  "ANO_ELEICAO",
  "NUM_TURNO",
  "DESCRICAO_ELEICAO",
  "SIGLA_UF",
  "SIGLA_UE",
  "CODIGO_MUNICIPIO",
  "NOME_MUNICIPIO",
  "NUMERO_ZONA",
  "CODIGO_CARGO",
  "NUMERO_CAND",
  "SQ_CANDIDATO",
  "NOME_CANDIDATO",
  "NOME_URNA_CANDIDATO",
  "DESCRICAO_CARGO",
  "COD_SIT_CAND_SUPERIOR",
  "DESC_SIT_CAND_SUPERIOR",
  "CODIGO_SIT_CANDIDATO",
  "DESC_SIT_CANDIDATO",
  "CODIGO_SIT_CAND_TOT",
  "DESC_SIT_CAND_TOT",
  "NUMERO_PARTIDO",
  "SIGLA_PARTIDO",
  "NOME_PARTIDO",
  "SEQUENCIAL_LEGENDA",
  "NOME_COLIGACAO",
  "COMPOSICAO_LEGENDA",
  "TOTAL_VOTOS"
)
# usando o vetor criado, renomeia as variáveis da base
names(votacao_candidato_munzona_2012_SP) <- nome_var

# Deixa o nome das variáveis padronizadas em snake case (tudo minúsculo, palavras separadas por um underscore _)
votacao <-
  votacao_candidato_munzona_2012_SP %>% janitor::clean_names()

# Função glimpse ajuda a ter uma ideia dos tipos de dados
# glimpse(votacao)

3. Lendo o leaime.pdf e observando as variáveis no banco de dados, o que representa uma observação (uma linha)? Ou seja, qual a unidade de análise aqui?

4. Leia até o final as instruções e identifique quais variáveis serão necessárias para o resto do exercício. Tire do seu banco de dados as variáveis desnecesárias.

# usando a função select, retira as  variáveis não necessárias para o desafio
votacao_limpa <-
  votacao %>% select(
    -data_geracao,-hora_geracao,-ano_eleicao,
    -sigla_uf,-sigla_ue,-descricao_eleicao,
    -codigo_cargo,-cod_sit_cand_superior,-desc_sit_candidato,
    -composicao_legenda,-nome_coligacao,-nome_partido,
    -sequencial_legenda,-codigo_sit_cand_tot,
    -codigo_sit_candidato,-desc_sit_cand_superior,
    -sq_candidato
  )

7. Renomeie a variável com nome pouco claro DESC_SIT_CAND_TOT para RESTULADO

# usando a função rename, renomeia a coluna

votacao_limpa <- votacao_limpa %>%
  rename(resultado = desc_sit_cand_tot)

head(votacao_limpa)

5. Selecione apenas as linhas que contém resultados eleitorais para o primeiro turno da eleição do prefeito(a).

# usa a função filter, para filtrar os dados do primeiro turno, e para cargo de prefeito. Como iremos usar esse resultado em outros exercícios, salvei essa base filtrada como pref_1turno.

pref_1turno <- votacao_limpa %>%
  filter(num_turno == 1 &
           descricao_cargo == "PREFEITO")

pref_1turno

6. Note que candidatos podem aparecer mais de uma vez na tabela em Q4 (porque existem múltiplas zonas em cada município). Usando identificadores únicos, identifique os candidatos distintos para o primeiro turno do prefeito. Explique no seu relatório quantos candidatos concorrem para prefeito no primeiro turno em 2012.

8. Filtrar os dados para os candidatos que se candidataram com Nome de Urna ígual ao seu Nome completo, e identifique os candidatos únicos de novo. No seu relatório, explique qual percentagem de todos os candidatos para prefeito no primeiro turno isso representa.

# Usando a base de prefeitos no primeiro turno filtrada anteriormente, filtro candidatos que o nome seja igual ao nome de urna (com a função filter), e obtenho os dados únicos (com a função distinct)

cand_nome_igual <- pref_1turno %>% 
  filter(nome_candidato == nome_urna_candidato) %>%
  distinct(nome_candidato)
# Com a função nrow, conto o número de linhas(com nrow) na base `cand_nome_igual` (que aqui representa o número de candidados que tem o nome igual ao nome de urna), e divido pelo número de linhas na base `distinct_cand_pref_1turno`, que são todos os prefeitos que participaram do primeiro turno.
# depois de dividir, multiplico por 100 para obter a porcentagem.
# usando a função round, arredondo o valor percentual obtido para conter apenas 2 casas decimais!

porcentagem <- round((nrow(cand_nome_igual) / nrow(distinct_cand_pref_1turno)) * 100, digits = 2)

9. Quantos dos candidatos identificados em Q8 foram eleitos no primeiro turno?

# Filtra a base de prefeito que participou no primeiro turno, para apenas prefeitos que foram eleitos

eleitos_1turno_pref <- pref_1turno %>%
   filter(nome_candidato == nome_urna_candidato) %>% 
  filter(resultado == "ELEITO")

10. Voltando para os dados de todos os candidatos no primeiro turno, vamos focar a nossa análise no município de São Paulo (código do TSE 71072). Ordene os dados por número de votos e identifique qual candidato recebeu o maior número de votos em qualquer zona da cidade.

votacao_sp_pref_1turno <- pref_1turno %>% 
  filter(codigo_municipio == "71072") %>% # filtra o municípo de são paulo
  arrange(desc(total_votos)) # ordena em ordem decrescente o número de votos por zona


head(votacao_sp_pref_1turno)

11. Usando a sua própria classificação, crie uma nova variável que descreve a ideologia de cada partido no banco de dados do município de São Paulo nas três categorias ‘Esquerda’, ‘Direita’ e ‘Outro’.

# Quais são os partidos que participaram, e que devem ser considerados na classificação?

votacao_limpa %>% 
  filter(codigo_municipio == "71072") %>% # filtra o município de são paulo
  distinct(sigla_partido) # obtem os valores únicos, distintos
# Usando o mutate e case_when, cria nova coluna com a  classificação de ideologia de partidos

votacao_limpa %>% 
  filter(codigo_municipio == "71072") %>% # filtra o municípi de são paulo
  mutate(
    ideologia = case_when( # cria nova coluna ideologia, que receberá os valores
      
      
      # Partidos da esquerda
      sigla_partido %in% c("PSOL", "PT", "PDT", "PSTU", "PC do B", "PCO", "PSB","PCB")  ~ "Esquerda",
      
      #Partidos da direita
      sigla_partido %in% c("PSD", "PSDB", "PRP", "PTC", "PSL", "PRTB", "PSDC", "DEM", "PP", "PSC") ~ "Direita",
      
      # Partidos classificados como Outro - Centro?
      sigla_partido %in% c("PV", "PMN", "PTN", "PMDB", "PTB") ~ "Outro",
      
      
    # Os valores que não coloquei em nenhuma outra categoria receberão "Outro"
      TRUE ~ "Outro"
    )
  ) 

12. Crie uma variável que indica se o candidato no município de São Paulo recebeu mais de 10.000 votos na zona.

# Com o mutate e case_when, cria nova coluna de dados lógicos (TRUE/FALSE), sendo TRUE quem recebeu mais de 10 mil votos na zona.

pref_1turno %>%
  filter(codigo_municipio == "71072") %>%  # filtra municipio de são paulo
  mutate(mais_10milvotos = case_when(total_votos > 10000 ~ TRUE,
                                     TRUE ~ FALSE)) %>% 
  arrange(desc(total_votos))

13. Voltando para os dados orginais, filtrar para os dados dos vereadores. Agora, imagine que não temos os dados do partido de cada candidato e queremos recuperar do NUMERO_CAND, em que os primeiros dois digitos sempre refletem o número do partido do candidato. Divida a coluna NUMERO_CAND em duas para criar uma coluna de NUM_PARTIDO e outra de NUM_CAND_RESTANTE.

# Com a função filter, filtramos as linhas para cargo de vereador,
# e com a função separate , separamos a coluna numero_cand
sep <- votacao_limpa %>%
  filter(descricao_cargo == "VEREADOR") %>%
  separate(numero_cand, c("num_partido", "num_cand_restante"), 2)

sep

14. Agora, unifique as colunas NUM_PARTIDO e NUM_CAND_RESTANTE criado em Q9. O resultado deve ser ígual à coluna original NUMERO_CAND.

# Com a função unite unimos novamente as colunas separadas anteriormente

sep %>%
  unite(numero_cand_novo, c(num_partido, num_cand_restante), sep = "")

15. Limpe o seu script e Knit para um documento de HTML, por exemplo adicionando comentários, verificando que as respostas fazem sentidos, inserindo in-line código, tirando o código, warnings e mensagens do documento final, e formatando as tabelas melhores com df_print: paged no cabeçalho.